<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title>Refinando Controles de Acesso - Zend Framework Manual</title>

    <link href="../css/shCore.css" rel="stylesheet" type="text/css" />
    <link href="../css/shThemeDefault.css" rel="stylesheet" type="text/css" />
    <link href="../css/styles.css" media="all" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Zend Framework</h1>
<h2>Programmer's Reference Guide</h2>
<ul>
    <li><a href="../en/zend.acl.refining.html">Inglês (English)</a></li>
    <li><a href="../pt-br/zend.acl.refining.html">Português Brasileiro (Brazilian Portuguese)</a></li>
</ul>
<table width="100%">
    <tr valign="top">
        <td width="85%">
            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.acl.introduction.html">Introdu&ccedil;&atilde;o</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.acl.html">Zend_Acl</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.acl.advanced.html">Uso Avan&ccedil;ado</a></div>
                    </td>
                </tr>
            </table>
<hr />
<div id="zend.acl.refining" class="section"><div class="info"><h1 class="title">Refinando Controles de Acesso</h1></div>
    

    <div class="section" id="zend.acl.refining.precise"><div class="info"><h1 class="title">Controles de Acesso Precisos</h1></div>
        

        <p class="para">
            A <acronym class="acronym">ACL</acronym> básica definida na
            <a href="zend.acl.introduction.html" class="link">seção anterior</a> mostra como vários
            privilégios podem ser permitidos em toda a <acronym class="acronym">ACL</acronym> (todos os recursos).
            Contudo, na prática, controles de acesso tendem a possuir exceções e diversos níveis
            de complexidade. <span class="classname">Zend_Acl</span> permite a você realizar estas melhorias
            de uma forma simples e flexível.
        </p>

        <p class="para">
            Para o <acronym class="acronym">CMS</acronym> de exemplo, foi determinado que, embora o grupo &#039;equipe&#039;
            cubra as necessidades da grande maioria dos usuários, há necessidade de um novo
            grupo &#039;marketing&#039;, que necessita de acesso a newsletter e últimas notícias no
            <acronym class="acronym">CMS</acronym>. O grupo é quase auto-suficiente e terá a habilidade de publicar
            e arquivar tanto newsletters como últimas notícias.
        </p>

        <p class="para">
            Adicionalmente, também foi solicitado que o grupo &#039;equipe&#039; tenha acesso liberado para
            visualizar notícias mas não possam revisar as notícias mais recentes. Finalmente, deve
            ser impossível para qualquer um (inclusive adminsitradores) arquivar qualquer notícia
            de &#039;comunicado&#039;, pois eles ficam visíveis por somente 1 ou 2 dias.
        </p>

        <p class="para">
            Primeiro, revisamos o registro de papéis para refletir estas alterações. Determinamos
            que o grupo &#039;marketing&#039; tem o mesmo conjunto básico de permissões que &#039;equipe&#039;,
            portanto definimos &#039;marketing&#039; de modo a herdar as permissões de &#039;equipe&#039;:
        </p>

        <pre class="programlisting brush: php">
// O novo grupo &#039;marketing&#039; herda permissões de &#039;equipe&#039;
$acl-&gt;addRole(new Zend_Acl_Role(&#039;marketing&#039;), &#039;equipe&#039;);
</pre>


        <p class="para">
            Em seguida, note que os controles de acesso acima se referem a recursos específicos
            (ex., &quot;newsletter&quot;, &quot;últimas notícias&quot;, &quot;comunicados&quot;). Agora vamos adicionar esses
            recursos:
        </p>

        <pre class="programlisting brush: php">
// Create Resources for the rules

// newsletter
$acl-&gt;addResource(new Zend_Acl_Resource(&#039;newsletter&#039;));

// Notícias
$acl-&gt;addResource(new Zend_Acl_Resource(&#039;notícias&#039;));

// Últimas notícias
$acl-&gt;addResource(new Zend_Acl_Resource(&#039;últimas&#039;), &#039;notícias&#039;);

// Comunicados
$acl-&gt;addResource(new Zend_Acl_Resource(&#039;comunicados&#039;), &#039;notícias&#039;);
</pre>


        <p class="para">
            Então é simplesmente uma questão de definição dessas regras mais específicas para as
            áreas da <acronym class="acronym">ACL</acronym>:
        </p>

        <pre class="programlisting brush: php">
// Marketing deve publicar e arquivar newsletters e últimas notícias
$acl-&gt;allow(&#039;marketing&#039;,
            array(&#039;newsletter&#039;, &#039;últimas&#039;),
            array(&#039;publicar&#039;, &#039;arquivar&#039;));

// &#039;Equipe&#039; (e &#039;Marketing&#039;, por herança) são negados a revisar últimas
//notícias
$acl-&gt;deny(&#039;equipe&#039;, &#039;últimas&#039;, &#039;revisar&#039;);

// Todos (incluindo administradores) não podem arquivar notícias de comunicados
$acl-&gt;deny(null, &#039;comunicados&#039;, &#039;arquivar&#039;);
</pre>


        <p class="para">
            Agora podemos consultar a <acronym class="acronym">ACL</acronym>, respeitando as últimas alterações:
        </p>

        <pre class="programlisting brush: php">
echo $acl-&gt;isAllowed(&#039;equipe&#039;, &#039;newsletter&#039;, &#039;publicar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// negado

echo $acl-&gt;isAllowed(&#039;marketing&#039;, &#039;newsletter&#039;, &#039;publicar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// permitido

echo $acl-&gt;isAllowed(&#039;equipe&#039;, &#039;últimas&#039;, &#039;publicar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// negado

echo $acl-&gt;isAllowed(&#039;marketing&#039;, &#039;últimas&#039;, &#039;publicar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// permitido

echo $acl-&gt;isAllowed(&#039;marketing&#039;, &#039;últimas&#039;, &#039;arquivar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// permitido

echo $acl-&gt;isAllowed(&#039;marketing&#039;, &#039;últimas&#039;, &#039;revisar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// negado

echo $acl-&gt;isAllowed(&#039;editor&#039;, &#039;comunicados&#039;, &#039;arquivar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// negado

echo $acl-&gt;isAllowed(&#039;administrador&#039;, &#039;comunicados&#039;, &#039;arquivar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// negado
</pre>

    </div>

    <div class="section" id="zend.acl.refining.removing"><div class="info"><h1 class="title">Removendo Controles de Acesso</h1></div>
        

        <p class="para">
            Para remover um ou mais regras de acesso da <acronym class="acronym">ACL</acronym>, simplesmente use os
            métodos disponíveis  <span class="methodname">removeAllow()</span> ou
             <span class="methodname">removeDeny()</span>. Assim como  <span class="methodname">allow()</span> e
             <span class="methodname">deny()</span>, você pode fornecer um valor <b><tt>NULL</tt></b>
            para indicar aplicação a todos os papéis, recursos e/ou privilégios:
        </p>

        <pre class="programlisting brush: php">
// Remove a recusa de revisão de últimas notícias para &#039;equipe&#039; (e marketing,
// por herança)
$acl-&gt;removeDeny(&#039;equipe&#039;, &#039;últimas&#039;, &#039;revisar&#039;);

echo $acl-&gt;isAllowed(&#039;marketing&#039;, &#039;últimas&#039;, &#039;revisar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// permitido

// Remove a permissão para publicar e arquivar newsletters para &#039;marketing&#039;
$acl-&gt;removeAllow(&#039;marketing&#039;,
                  &#039;newsletter&#039;,
                  array(&#039;publicar&#039;, &#039;arquivar&#039;));

echo $acl-&gt;isAllowed(&#039;marketing&#039;, &#039;newsletter&#039;, &#039;publicar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// negado

echo $acl-&gt;isAllowed(&#039;marketing&#039;, &#039;newsletter&#039;, &#039;arquivar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// negado
</pre>


        <p class="para">
            Privilégios podem ser modificados incrementalmente, como indicado acima, mas um valor
            <b><tt>NULL</tt></b> para privilégios sobrescreve tais mudanças incrementais:
        </p>

        <pre class="programlisting brush: php">
// Concede a &#039;marketing&#039; todas as permissões sobre &#039;últimas notícias&#039;
$acl-&gt;allow(&#039;marketing&#039;, &#039;últimas&#039;);

echo $acl-&gt;isAllowed(&#039;marketing&#039;, &#039;últimas&#039;, &#039;publicar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// permitido

echo $acl-&gt;isAllowed(&#039;marketing&#039;, &#039;últimas&#039;, &#039;arquivar&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// permitido

echo $acl-&gt;isAllowed(&#039;marketing&#039;, &#039;útlimas&#039;, &#039;qualquer coisa&#039;) ?
     &quot;permitido&quot; : &quot;negado&quot;;
// permitido
</pre>

    </div>
</div>
        <hr />

            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.acl.introduction.html">Introdu&ccedil;&atilde;o</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.acl.html">Zend_Acl</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.acl.advanced.html">Uso Avan&ccedil;ado</a></div>
                    </td>
                </tr>
            </table>
</td>
        <td style="font-size: smaller;" width="15%"> <style type="text/css">
#leftbar {
	float: left;
	width: 186px;
	padding: 5px;
	font-size: smaller;
}
ul.toc {
	margin: 0px 5px 5px 5px;
	padding: 0px;
}
ul.toc li {
	font-size: 85%;
	margin: 1px 0 1px 1px;
	padding: 1px 0 1px 11px;
	list-style-type: none;
	background-repeat: no-repeat;
	background-position: center left;
}
ul.toc li.header {
	font-size: 115%;
	padding: 5px 0px 5px 11px;
	border-bottom: 1px solid #cccccc;
	margin-bottom: 5px;
}
ul.toc li.active {
	font-weight: bold;
}
ul.toc li a {
	text-decoration: none;
}
ul.toc li a:hover {
	text-decoration: underline;
}
</style>
 <ul class="toc">
  <li class="header home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="reference.html">Refer&ecirc;ncia do Zend Framework</a></li>
  <li class="header up"><a href="zend.acl.html">Zend_Acl</a></li>
  <li><a href="zend.acl.introduction.html">Introdu&ccedil;&atilde;o</a></li>
  <li class="active"><a href="zend.acl.refining.html">Refinando Controles de Acesso</a></li>
  <li><a href="zend.acl.advanced.html">Uso Avan&ccedil;ado</a></li>
 </ul>
 </td>
    </tr>
</table>

<script type="text/javascript" src="../js/shCore.js"></script>
<script type="text/javascript" src="../js/shAutoloader.js"></script>
<script type="text/javascript" src="../js/main.js"></script>

</body>
</html>